//
//  HomeTableViewController.swift
//  基于Swift的微博设计与实现
//
//  Created by 张源海 on 15/11/22.
//  Copyright © 2015年 张源海. All rights reserved.
//

import UIKit
import SVProgressHUD
/// 原创微博的可重用 ID
let StatusCellNormalId = "StatusCellNormalId"
/// 转发微博的可重用 ID
let StatusCellRetweetedId = "StatusCellRetweetedId"

class HomeTableViewController: VisitorTableViewController {
    
    /// 微博数据列表模型
    private lazy var listViewModel = StatusListViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !UserAccountViewModel.sharedUserAccount.userLogon {
            
            visitorView?.setupInfo(nil, title: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView()
        
        loadData()
        
        // 注册通知 － 如果使用 通知中心的 block 监听，其中的 self 一定要 弱引用！
        NSNotificationCenter.defaultCenter().addObserverForName(WBStatusSelectedPhotoNotification,
            object: nil,
            queue: nil) { [weak self] (n) -> Void in
                
                guard let indexPath = n.userInfo?[WBStatusSelectedPhotoIndexPathKey] as? NSIndexPath else {
                    return
                }
                guard let urls = n.userInfo?[WBStatusSelectedPhotoURLsKey] as? [NSURL] else {
                    return
                }
                
                let vc = PhotoBrowserViewController(urls: urls, indexPath: indexPath)
                
                // Modal 展现
                self?.presentViewController(vc, animated: true, completion: nil)
        }
    }
    
    deinit {
        // 注销通知
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    /// 准备表格
    private func prepareTableView() {
        // 注册可重用 cell
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: StatusCellNormalId)
        tableView.registerClass(StatusRetweetedCell.self, forCellReuseIdentifier: StatusCellRetweetedId)
        
        // 取消分割线
        tableView.separatorStyle = .None
        
        // 预估行高 - 需要尽量准确
        tableView.estimatedRowHeight = 400
        
        // 下拉刷新控件默认没有 - 高度 60
        refreshControl = WBRefreshControl()
        // 添加监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 上拉刷新视图
        tableView.tableFooterView = pullupView
    }
    
    /// 加载数据
    @objc private func loadData() {
        
        refreshControl?.beginRefreshing()
        listViewModel.loadStatus(isPullup: pullupView.isAnimating()) { (isSuccessed) -> () in
            
            // 关闭刷新控件
            self.refreshControl?.endRefreshing()
            // 关闭上拉刷新
            self.pullupView.stopAnimating()
            
            if !isSuccessed {
                SVProgressHUD.showInfoWithStatus("加载数据错误，请稍后再试")
                return
            }
            
            //            print(self.listViewModel.statusList)
            
            // 刷新数据
            self.tableView.reloadData()
        }
    }
    
    // MARK: - 懒加载控件
    /// 上拉刷新提示视图
    private lazy var pullupView: UIActivityIndicatorView = {
        
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        indicator.color = UIColor.lightGrayColor()
        
        return indicator
    }()
}
// MARK: - 数据源方法
extension HomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//        // 不会调用行高方法
//        // tableView.dequeueReusableCellWithIdentifier()
//        // 会调用行高方法！
//        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellNormalId, forIndexPath: indexPath) as! StatusCell
//        
//        cell.viewModel = listViewModel.statusList[indexPath.row]
//        
//        return cell
        // 1. 获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        
        // 2. 获取可重用 cell 会调用行高方法！
        let cell = tableView.dequeueReusableCellWithIdentifier(vm.cellId, forIndexPath: indexPath) as! StatusCell
        
        // 3. 设置视图模型
        cell.viewModel = vm
        
        // 4. 判断是否是最后一条微博
        if indexPath.row == listViewModel.statusList.count - 1 && !pullupView.isAnimating() {
            // 开始动画
            pullupView.startAnimating()
            
            // 上拉刷新数据
            loadData()
            
//            print("上拉刷新数据")
        }
        
        return cell

    }
    /**
     行高
     
     -- 设置了预估行高
     * 当前显示的行高方法会调用三次（每个版本的Xcode调用次数可能不同）
     
     问题：预估行高如果不同，计算的次数不同！
     
     1. 使用预估行高，计算出预估的 contentSize
     2. 根据预估行高，判断计算次数，顺序计算每一行的行高，更新 contentSize
     3. 如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新 contentSize
     4. 使用预估行高，每个 cell 的显示前需要计算，单个 cell 的效率是低的，从整体效率高！
     
     执行顺序 行数 -> 每个[cell -> 行高]
     
     预估行高：尽量靠近！
     
     -- 没设置了预估行高
     * 1. 计算所有行的高度
     * 2. 再计算显示行的高度
     
     执行顺序 行数 -> 行高 -> cell
     
     问题：为什么要调用所有行高方法？UITableView 继承自 UIScrollView
     表格视图滚动非常流畅 -> 需要提前计算出 contentSize
     
     苹果官方文档有指出，如果行高是固定值，就不要实现行高代理方法！
     
     实际开发中，行高一定要缓存！
     */
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        return listViewModel.statusList[indexPath.row].rowHeight
    }
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//        print("选中行 \(indexPath)")
    }

}

